/*f
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Persistencia.daos;

import Persistencia.CRUD;
import Persistencia.DAO;
import Persistencia.SeqHelper;
import Persistencia.modelos.*;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.TreeSet;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Bruno
 */
public class PresidenteDAO implements DAO<Integer, Presidente> {

    public void salva(Presidente obj) {
        //Pessoa pessoa = (Pessoa) obj;               
        CRUD.adiciona("pessoa", obj.getFieldsToInsertAsString(), obj.getFieldContentToInsertAsString());

        ResultSet rs = CRUD.consulta("select max(idpessoa) from pessoa");
        try {
            rs.next();
            int i = SeqHelper.getId("time");
            String time = (obj.getTime() == null) ? "null, " : "" + obj.getTime().getIdTime() + "";
            //SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
            CRUD.adiciona("Presidente", "IDPESSOA, NROVOTOS,QTDEELEITO,IDTIME", i + "," + obj.getNroVotos() + " , " + obj.getQtdEleito() + "," + time);
        } catch (SQLException ex) {
            Logger.getLogger(PresidenteDAO.class.getName()).log(Level.SEVERE, null, ex);
        }

    }

    public void atualiza(Presidente obj) {
        List<String> c = new ArrayList<String>();
        // c.add("IDPresidente");
        c.add("nomepessoa");
        c.add("datanascpessoa");
        c.add("salariopessoa");
        c.add("dataadmissao");

        List<String> a = new ArrayList<String>();
        a.add("'" + obj.getNomePessoa() + "'");
        SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
        a.add("'" + sdf.format(obj.getDataAdmissao()) + "'");
        a.add(String.valueOf(obj.getSalarioPessoa()));
        a.add("'" + sdf.format(obj.getDataNascPessoa()) + "'");
        CRUD.atualiza("pessoa", c, a, " where idpessoa = " + obj.getIdPessoa());

        c.clear();
        a.clear();
        c.add("IDPESSOA");
        c.add("NROVOTOS");
        c.add("QTDEELEITO");
        c.add("IDTIME");

        a.add(String.valueOf(obj.getIdPessoa()));
        a.add(String.valueOf(obj.getNroVotos()));
        a.add(String.valueOf(obj.getQtdEleito()));
        a.add(String.valueOf(obj.getTime().getIdTime()));
        
        CRUD.atualiza("Presidente", c, a, " where IDpessoa = " + obj.getIdPessoa());

    }

    public void deleta(Integer obj) {
        List<Integer> list = new ArrayList<Integer>();
        list.add(obj);
        String campo = "idpessoa";
        CRUD.deleta("Presidente", campo, list);
        CRUD.deleta("Pessoa", campo, list);
    }

    public Presidente recupera(Integer obj) {
        try {
            ResultSet rs = CRUD.consulta("select * from Presidente where idpessoa = " + obj);

            Collection<Integer> timesAux = new TreeSet<Integer>();

            Collection<Presidente> presidentes = new ArrayList<Presidente>();
            Presidente p = null;
            while (rs.next()) {
                p = new Presidente();
                p.setIdPessoa(rs.getInt("idpessoa"));
                p.setNomePessoa(rs.getString("NOMEPESSOA"));
                p.setDataNascPessoa(rs.getDate("DATANASCPESSOA"));
                p.setSalarioPessoa(rs.getInt("SALARIOPESSOA"));
                p.setDataAdmissao(rs.getDate("DATAADMISSAO"));
                p.setIdTime(rs.getInt("IDTIME"));
                p.setNroVotos(rs.getInt("NROVOTOS"));;
                p.setQtdEleito(rs.getInt("QTDEELEITO"));
                timesAux.add(p.getTime().getIdTime());
                presidentes.add(p);
            }

            Collection<Time> times = new TimeDAO().recuperaLista(timesAux);

            preencheRelacionamentos(times,p);


            return p;
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

    public Collection<Presidente> recuperaLista(Collection<Integer> chaves) {
        StringBuilder sb = new StringBuilder();
        Iterator<Integer> it = chaves.iterator();
        while (it.hasNext()) {
            sb.append(it.next()).append(",");
        }
        String ids = sb.toString().substring(0, sb.toString().length() - 1);

        try {
            ResultSet rs = CRUD.consulta("select * from Presidente where idpessoa in (" + ids + ")");

            Collection<Integer> timesAux = new TreeSet<Integer>();

            Collection<Presidente> presidentes = new ArrayList<Presidente>();

            while (rs.next()) {
                Presidente p = new Presidente();
                p.setIdPessoa(rs.getInt("idpessoa"));
                p.setNomePessoa(rs.getString("NOMEPESSOA"));
                p.setDataNascPessoa(rs.getDate("DATANASCPESSOA"));
                p.setSalarioPessoa(rs.getInt("SALARIOPESSOA"));
                p.setDataAdmissao(rs.getDate("DATAADMISSAO"));
                p.setIdTime(rs.getInt("IDTIME"));
                p.setNroVotos(rs.getInt("NROVOTOS"));;
                p.setQtdEleito(rs.getInt("QTDEELEITO"));
                timesAux.add(p.getTime().getIdTime());
                presidentes.add(p);
            }

            Collection<Time> times = new TimeDAO().recuperaLista(timesAux);
            
            for (Presidente p : presidentes) {
                preencheRelacionamentos(times,p);
            }


            return presidentes;
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }



    public Collection<Presidente> recuperaTodos() {
        
try {
            ResultSet rs = CRUD.consulta("select * from Presidente ");

            Collection<Integer> timesAux = new TreeSet<Integer>();

            Collection<Presidente> presidentes = new ArrayList<Presidente>();

            while (rs.next()) {
                Presidente p = new Presidente();
                p.setIdPessoa(rs.getInt("idpessoa"));
                p.setNomePessoa(rs.getString("NOMEPESSOA"));
                p.setDataNascPessoa(rs.getDate("DATANASCPESSOA"));
                p.setSalarioPessoa(rs.getInt("SALARIOPESSOA"));
                p.setDataAdmissao(rs.getDate("DATAADMISSAO"));
                p.setIdTime(rs.getInt("IDTIME"));
                p.setNroVotos(rs.getInt("NROVOTOS"));;
                p.setQtdEleito(rs.getInt("QTDEELEITO"));
                timesAux.add(p.getTime().getIdTime());
                presidentes.add(p);
            }

            Collection<Time> times = new TimeDAO().recuperaLista(timesAux);
            
            for (Presidente p : presidentes) {
                preencheRelacionamentos(times,p);
            }


            return presidentes;
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

    
 private void preencheRelacionamentos(Collection<Time> times, Presidente j) {
        Iterator<Time> itTimes = times.iterator();
        while (itTimes.hasNext()) {
            Time corrente = itTimes.next();
            if (j.getIdTime() == corrente.getIdTime()) {
                j.setTime(corrente);
                itTimes.remove();
            }
        }


    }

}
